"""Events：Python提供了Event对象用于线程间通信，它是由线程设置的信号标志，如果信号标志位真，则其他线程等待直到信号接触。

Event对象实现了简单的线程通信机制，它提供了设置信号，清除信号，等待等用于实现线程间的通信。

event = threading.Event() 创建一个event
1 设置信号event.set()：使用Event的set（）方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet（）方法来判断其内部信号标志的状态。当使用event对象的set（）方法后，isSet（）方法返回真
2 清除信号event.clear()：使用Event对象的clear（）方法可以清除Event对象内部的信号标志，即将其设为假，当使用Event的clear方法后，isSet()方法返回假
3 等待event.wait()：Event对象wait的方法只有在内部信号为真的时候才会很快的执行并完成返回。当Event对象的内部信号标志位假时，则wait方法一直等待到其为真时才返回。也就是说必须set新号标志位真
案例：A、B、C三人吃饭，都准备就绪，当收到主人开吃的命令后，ABC三人开吃。
"""
from concurrent.futures import ThreadPoolExecutor
from threading import currentThread, Event
import time


def lunch(name):
    print("Start thread {} ...".format(currentThread().getName()))
    print("{} is ready!".format(name))
    time.sleep(1)
    event.wait()  # 等待主人发话（堵塞）
    print("Thread {} receive the message...".format(currentThread().getName()))
    print("Friend {} starts to eat!".format(name))


if __name__ == "__main__":
    event = Event()
    with ThreadPoolExecutor() as executor:
        for i in "ABC":
            executor.submit(lunch, i)

        time.sleep(1)
        print("Main thread send message!")
        event.set()  # 主人发话...
